package com.lanyou.esb.cook.proxy.service;

import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import redis.clients.jedis.exceptions.JedisException;

import com.lanyou.esb.cook.proxy.entity.AccLog;
import com.lanyou.esb.cook.proxy.entity.FieldSystem;
import com.lanyou.esb.cook.proxy.entity.Http;
import com.lanyou.esb.cook.proxy.entity.IfAlarm;
import com.lanyou.esb.cook.proxy.service.push.Push;

/**
 * 接口告警信息处理接口
 * 
 * @author Davey.wu
 */
public interface IfAlarmService {

	/**
	 * 接口告警信息存储到Redis
	 *
	 * @param alarm
	 *            ：告警信息
	 */
	void pushToRedis(IfAlarm alarm);

	/**
	 * 接口告警信息存储到Redis
	 * 
	 * @param alarms
	 *            ：告警信息集合
	 * @param log
	 *            ：日志
	 */
	void pushToRedis(List<IfAlarm> alarms, AccLog log);

	/**
	 * 保存告警信息到数据库
	 * 
	 * @param alarms
	 *            ：告警信息集合
	 * @throws Exception
	 */
	void save(List<IfAlarm> alarms) throws Exception;

	/**
	 * 获取重复告警 <br>
	 * 
	 * @param alarm
	 *            ：告警信息
	 * @return
	 * @throws JedisException
	 */
	IfAlarm getRepeat(IfAlarm alarm) throws JedisException;

	/**
	 * 生成告警对象
	 * 
	 * @param pubSystem
	 *            ：发布方系统
	 * @param callSystem
	 *            ：调用方系统
	 * @param http
	 *            ：接口
	 * @param reqeust
	 *            ：请求对象
	 * @param type
	 *            ：告警类型
	 * @param level
	 *            ：告警等级
	 * @param flow
	 *            ：流量
	 * @param threshold
	 *            ：流量阀值
	 * @param reqIp
	 *            ：请求IP
	 * @param content
	 *            :请求报文
	 * @param resCode
	 *            ：响应码
	 * @param emailReceiver
	 *            ：邮件接收人
	 * @param errorDate
	 *            ：告警发生时间
	 * @param answerTime
	 *            ：响应时长
	 * @param peakValue
	 *            ：告警峰值
	 * @param createDate
	 *            ：创建时间
	 * @return
	 */
	IfAlarm create(FieldSystem pubSystem, FieldSystem callSystem, Http http,
			HttpServletRequest reqeust, String type, String level, int flow,
			int threshold, String reqIp, String content, String resCode,
			String emailReceiver, Date errorDate, float answerTime,
			float peakValue, Date createDate);

	/**
	 * 获取需要推送的数据
	 * 
	 * @return
	 */
	Push<IfAlarm> getPush();

}
